import 'dart:developer' as developer;
import 'package:get/get.dart';
import './rongcloud_service.dart';
import './user_service.dart';
import '../api/friend_api.dart';
import '../api/activity_api.dart';
import '../api/user_api.dart';
import '../models/index.dart';
import '../utils/loading_util.dart';

/// 📬 业务编排服务（企业级设计）
/// 
/// 🎯 核心职责：
/// - 统一管理复杂业务流程的编排和协调
/// - 协调多个API调用和IM消息发送
/// - 处理业务流程中的错误和回滚
/// - 提供事务性的业务操作
/// 
/// 📐 设计原则：
/// - 单一职责：只负责业务流程编排，不包含具体业务逻辑
/// - 高内聚：所有编排逻辑集中管理
/// - 低耦合：API层、IM层、UI层互不影响
/// - 易扩展：可轻松添加新的业务流程
/// 
/// 🔥 使用场景：
/// 1. 好友申请流程（API + IM通知）
/// 2. 活动申请流程（API + IM通知）
/// 3. 活动审核流程（API + IM通知）
/// 4. 系统通知发送
/// 
/// ⚠️ 重要提示：
/// - 融云IM的用户ID是手机号，不是数据库用户ID
/// - 发送IM消息前需要先通过API获取目标用户的手机号
/// 
/// 🔥 消息类型识别规则：
/// - chat: 普通聊天消息
/// - friend_request: 好友申请消息（包含"好友申请"关键词）
/// - activity_request: 活动申请消息（包含"***"标识）
/// - activity_review: 活动审核结果消息（包含"申请参加的活动"+"审核已通过/已被拒绝"）
class BusinessOrchestrationService extends GetxService {
  static BusinessOrchestrationService get to => Get.find<BusinessOrchestrationService>();
  
  static const String tag = 'BusinessOrchestrationService';
  
  // ==================== 服务依赖 ====================
  
  RongCloudService get _rongCloud => Get.find<RongCloudService>();
  UserService get _userService => Get.find<UserService>();
  
  // ==================== 工具方法 ====================
  
  /// 🔥 获取用户手机号（参考playtrue3架构）
  /// 
  /// 融云IM的用户ID是手机号，不是数据库用户ID
  /// 发送IM消息前需要先通过此方法获取目标用户的手机号
  /// 
  /// @param userId 数据库用户ID
  /// @returns 用户手机号，失败返回null
  Future<String?> _getUserPhoneById(int userId) async {
    try {
      developer.log('$tag: 🔍 获取用户手机号 - 用户ID: $userId');
      
      // 🔥 参考playtrue3的实现，通过 UserApi.getUserFilteredContent 获取用户信息
      final userInfoResponse = await UserApi.getUserFilteredContent(
        userId: userId,
        contentType: 'activities', // 内容类型任意，我们只需要用户信息
      );
      
      if (userInfoResponse.isSuccess && userInfoResponse.user != null) {
        final userPhone = userInfoResponse.user!.userPhone;
        developer.log('$tag: ✅ 获取用户手机号成功: $userPhone');
        
        // 🔥 验证手机号格式（11位且以1开头）
        if (userPhone != null && 
            userPhone.length == 11 && 
            userPhone.startsWith(RegExp(r'1[3-9]'))) {
          return userPhone;
        } else {
          developer.log('$tag: ⚠️ 手机号格式异常: $userPhone');
          return null;
        }
      } else {
        developer.log('$tag: ❌ 获取用户信息失败: ${userInfoResponse.message}');
        return null;
      }
    } catch (e) {
      developer.log('$tag: 💥 获取用户手机号异常: $e');
      return null;
    }
  }
  
  // ==================== 登录相关流程 ====================
  
  /// 🔥 登录/注册业务编排（集成登录和注册，与小程序保持一致）
  /// 
  /// 企业级事务性操作：
  /// 1. 验证验证码
  /// 2. 检查账号是否已注册
  /// 3. 如果已注册：直接登录
  /// 4. 如果未注册：自动注册（默认个人用户）
  /// 5. 保存用户信息到 UserService
  /// 6. 连接融云IM
  /// 7. 获取好友列表
  /// 
  /// @param userPhone 用户手机号
  /// @param verificationCode 用户输入的验证码
  /// @param generatedCode 前端生成的验证码（用于验证）
  /// @returns 操作结果
  Future<Map<String, dynamic>> login({
    required String userPhone,
    required String verificationCode,
    required String generatedCode,
  }) async {
    try {
      developer.log('$tag: =============== 开始登录/注册业务编排 ===============');
      developer.log('$tag: 📱 手机号: $userPhone');
      
      // 步骤1: 验证验证码
      developer.log('$tag: 🔐 步骤1：验证验证码');
      if (verificationCode != generatedCode) {
        throw Exception('验证码错误，请重新输入');
      }
      developer.log('$tag: ✅ 验证码验证成功');
      
      // 步骤2: 检查账号是否已注册
      developer.log('$tag: 🔍 步骤2：检查账号是否已注册');
      final checkResult = await UserApi.checkPhone(userPhone: userPhone);
      
      final exists = checkResult['exists'] as bool?;
      final banned = checkResult['banned'] as bool?;
      final data = checkResult['data'];
      
      Map<String, dynamic> userInfo;
      
      // 步骤3: 根据检查结果处理
      if (exists == true && data != null) {
        // ✅ 用户已注册
        developer.log('$tag: ✅ 步骤3：用户已存在，直接登录');
        
        // 检查是否被封禁
        if (banned == true) {
          throw Exception('账号被管理员删除或封禁，无法登录。\n请联系App管理员');
        }
        
        userInfo = data;
        
      } else {
        // 🔥 用户未注册，自动注册（默认为个人用户）
        developer.log('$tag: 📝 步骤3：用户未注册，开始自动注册');
        developer.log('$tag:    用户类型: 个人用户（默认）');
        
        final userProfile = await UserApi.registerWithPhone(
          userPhone: userPhone,
          userType: '0',  // 0=个人用户（与小程序一致）
        );
        
        developer.log('$tag: ✅ 自动注册成功');
        developer.log('$tag:    用户ID: ${userProfile.userid}');
        developer.log('$tag:    用户名: ${userProfile.username}');
        
        userInfo = userProfile.toJson();
      }
      
      // 步骤4: 调用 UserService 完成登录
      // 🔥 关键改进：通过 UserService 完成登录，而不是直接操作 UserService 状态
      developer.log('$tag: 💾 步骤4：调用 UserService.loginWithUserInfo()');
      final userProfile = UserEntity.fromJson(userInfo);
      
      await _userService.loginWithUserInfo(userProfile, userPhone);
      
      developer.log('$tag: ✅ UserService 登录流程已完成');
      developer.log('$tag:    用户ID: ${userProfile.userid}');
      developer.log('$tag:    用户名: ${userProfile.username}');
      developer.log('$tag:    手机号: ${userProfile.userPhone}');
      developer.log('$tag:    积分: ${userProfile.userPoints}');
      
      developer.log('$tag: ✅ 登录/注册业务编排完成');
      
      return {
        'status': 'success',
        'message': '登录成功',
        'userInfo': userInfo,
      };
      
    } catch (e) {
      developer.log('$tag: ❌ 登录/注册业务编排失败: $e');
      // 🔥 提取纯文本错误消息，去掉"Exception: "前缀
      final errorMessage = e.toString().replaceAll('Exception: ', '');
      return {
        'status': 'error',
        'message': errorMessage,
      };
    }
  }
  
  // ==================== 好友相关通知 ====================
  
  /// 🔥 发送好友申请（API + IM通知）
  /// 
  /// ✅ 修复：移除重复扣除积分的逻辑
  /// 积分扣除由API层和后端统一处理
  /// 
  /// 企业级事务性操作：
  /// 1. 检查是否已被对方拒绝过
  /// 2. 调用API发送好友申请（API内部会处理积分检查和扣除）
  /// 3. 获取接收者手机号（融云用户ID）
  /// 4. API成功后发送IM通知
  /// 
  /// @param receiverId 接收者ID（数据库用户ID）
  /// @param message 申请消息
  /// @param checkPermission 是否检查积分权限（默认true）
  /// @returns 操作结果（包含积分变化信息）
  Future<Map<String, dynamic>> sendFriendRequest({
    required int receiverId,
    String? message,
    bool checkPermission = true,
  }) async {
    try {
      developer.log('$tag: =============== 发送好友申请（业务编排） ===============');
      developer.log('$tag: 👤 接收者ID: $receiverId');
      developer.log('$tag: 🎯 权限检查: $checkPermission');
      
      final currentUser = _userService.userInfo;
      if (currentUser?.userid == null) {
        throw Exception('用户未登录');
      }
      
      final senderId = currentUser!.userid!;
      
      // 🔥 直接调用API发送好友申请（后端会检查所有情况）
      // ⚠️ 前端无法检查"我向别人发送的申请"，只能依靠后端
      developer.log('$tag: 📡 调用API发送好友申请');
      final apiResult = await FriendApi.sendFriendRequest(
        senderId: senderId,
        receiverId: receiverId,
        message: message,
        checkPermission: checkPermission,  // ✅ 传递权限检查标志
      );
      
      // 🔥 检查API返回状态
      if (apiResult['status'] == 'error') {
        final errorMessage = apiResult['message'] ?? '好友申请发送失败';
        developer.log('$tag: ❌ API返回错误: $errorMessage');
        
        // 🔥 针对特定错误返回友好提示（不抛出异常）
        if (errorMessage.contains('已经发送过') || errorMessage.contains('请等待对方处理')) {
          developer.log('$tag: ⚠️ 重复发送申请');
          return {
            'status': 'warning',
            'message': '已经发送过好友申请，请耐心等待对方处理',
          };
        } else if (errorMessage.contains('已经是好友') || errorMessage.contains('你们已经是好友')) {
          developer.log('$tag: ⚠️ 已经是好友关系');
          return {
            'status': 'warning',
            'message': '你们已经是好友了',
          };
        } else if (errorMessage.contains('已拒绝') || errorMessage.contains('拒绝过')) {
          developer.log('$tag: ⚠️ 对方已拒绝过');
          return {
            'status': 'warning',
            'message': errorMessage,  // 使用后端返回的原始消息
          };
        } else {
          // 其他错误直接抛出异常
          throw Exception(errorMessage);
        }
      }
      
      if (apiResult['status'] != 'success') {
        developer.log('$tag: ❌ API返回未知状态: ${apiResult['status']}');
        throw Exception(apiResult['message'] ?? '好友申请发送失败');
      }
      
      developer.log('$tag: ✅ API调用成功');
      
      // 🔥 只有在真正成功时才显示积分提示
      final pointsChange = apiResult['pointsChange'] ?? 0;  // ✅ 修复：使用驼峰命名
      if (pointsChange != 0) {
        developer.log('$tag: 💰 积分变化: $pointsChange');
        
        // 🎯 显示积分扣减提示（轻提示，适用于所有调用场景）
        if (pointsChange < 0) {
          LoadingUtil.toast('已发送好友申请，消耗${pointsChange.abs()}积分');
        } else if (pointsChange > 0) {
          LoadingUtil.toast('已发送好友申请，获得${pointsChange}积分');
        }
      }
      
      // 🔥 获取接收者手机号（融云用户ID）
      developer.log('$tag: 📱 获取接收者手机号');
      final receiverPhone = await _getUserPhoneById(receiverId);
      
      if (receiverPhone == null || receiverPhone.isEmpty) {
        developer.log('$tag: ⚠️ 无法获取接收者手机号，跳过IM通知');
        return {
          'status': 'success',
          'message': '好友申请已发送（IM通知跳过）',
          ...apiResult,
        };
      }
      
      developer.log('$tag: ✅ 接收者手机号: $receiverPhone');
      
      // 🔥 发送IM通知消息（可选，失败不影响主流程）
      try {
        developer.log('$tag: 📨 发送IM通知消息');
        
        // 🔥 参考playtrue3的消息格式："收到一条新的好友申请"
        // 融云服务会自动通过extra添加发送者的姓名和头像
        final notificationMessage = '收到一条新的好友申请';
        
        // 🔥 使用手机号作为融云用户ID（参考playtrue3架构）
        final imSuccess = await _rongCloud.sendTextMessage(
          targetId: receiverPhone, // ✅ 使用手机号，不是数据库ID！
          content: notificationMessage,
          showLoading: false,
        );
        
        if (imSuccess) {
          developer.log('$tag: ✅ IM通知发送成功（融云用户ID: $receiverPhone）');
        } else {
          developer.log('$tag: ⚠️ IM通知发送失败（不影响主流程）');
        }
        
      } catch (e) {
        // IM发送失败不影响主流程
        developer.log('$tag: ⚠️ IM通知发送异常（不影响主流程）: $e');
      }
      
      developer.log('$tag: ✅ 好友申请业务编排完成');
      
      return {
        'status': 'success',
        'message': '好友申请已发送',
        ...apiResult,
      };
      
    } catch (e) {
      developer.log('$tag: ❌ 发送好友申请业务编排失败: $e');
      // 🔥 提取纯文本错误消息，去掉"Exception: "前缀
      final errorMessage = e.toString().replaceAll('Exception: ', '');
      return {
        'status': 'error',
        'message': errorMessage,
      };
    }
  }
  
  /// 🔥 处理好友申请（API + IM通知）
  /// 
  /// @param requestId 申请ID
  /// @param action 操作类型（accept/reject/ignore）
  /// @param applicantId 申请人ID（用于发送IM通知）
  /// @returns 操作结果
  Future<Map<String, dynamic>> handleFriendRequest({
    required int requestId,
    required String action,
    required int applicantId,
  }) async {
    try {
      developer.log('$tag: =============== 处理好友申请（事务性操作） ===============');
      developer.log('$tag: 📝 申请ID: $requestId');
      developer.log('$tag: 🎯 操作: $action');
      
      final currentUser = _userService.userInfo;
      if (currentUser?.userid == null) {
        throw Exception('用户未登录');
      }
      
      // 🔥 第一步：调用API处理好友申请
      developer.log('$tag: 📡 步骤1：调用API处理好友申请');
      final apiResult = await FriendApi.handleFriendRequest(
        requestId: requestId,
        action: action,
      );
      
      if (apiResult['status'] != 'success') {
        throw Exception(apiResult['message'] ?? '处理好友申请失败');
      }
      
      developer.log('$tag: ✅ API调用成功');
      
      // 🔥 第二步：发送IM通知消息（可选）
      try {
        developer.log('$tag: 📨 步骤2：发送IM通知消息');
        
        final userName = currentUser!.username ?? '用户';
        String notificationMessage = '';
        
        switch (action) {
          case 'accept':
            notificationMessage = '$userName 已同意你的好友申请';
            break;
          case 'reject':
            notificationMessage = '$userName 已拒绝你的好友申请';
            break;
          case 'ignore':
            // 忽略操作不发送通知
            developer.log('$tag: ⏭️ 忽略操作，跳过IM通知');
            return apiResult;
        }
        
        // 发送IM消息
        final imSuccess = await _rongCloud.sendTextMessage(
          targetId: applicantId.toString(),
          content: notificationMessage,
          showLoading: false,
        );
        
        if (imSuccess) {
          developer.log('$tag: ✅ IM通知发送成功');
        } else {
          developer.log('$tag: ⚠️ IM通知发送失败（不影响主流程）');
        }
        
      } catch (e) {
        developer.log('$tag: ⚠️ IM通知发送异常（不影响主流程）: $e');
      }
      
      developer.log('$tag: ✅ 处理好友申请事务完成');
      
      return apiResult;
      
    } catch (e) {
      developer.log('$tag: ❌ 处理好友申请失败: $e');
      // 🔥 提取纯文本错误消息，去掉"Exception: "前缀
      final errorMessage = e.toString().replaceAll('Exception: ', '');
      return {
        'status': 'error',
        'message': errorMessage,
      };
    }
  }
  
  // ==================== 活动相关通知 ====================
  
  /// 🔥 加入活动（API + IM通知）
  /// 
  /// 参考playtrue3架构实现：
  /// 1. 调用API加入活动
  /// 2. 获取发布者手机号（融云用户ID）
  /// 3. API成功后发送IM通知
  /// 4. 统一错误处理
  /// 
  /// @param activityId 活动ID
  /// @param publisherId 发布者ID（数据库用户ID）
  /// @param activityTitle 活动标题
  /// @returns 操作结果
  Future<Map<String, dynamic>> joinActivity({
    required int activityId,
    required int publisherId,
    required String activityTitle,
  }) async {
    try {
      developer.log('$tag: =============== 加入活动（事务性操作） ===============');
      developer.log('$tag: 🎯 活动ID: $activityId');
      developer.log('$tag: 📝 活动标题: $activityTitle');
      developer.log('$tag: 👤 发布者ID: $publisherId');
      
      final currentUser = _userService.userInfo;
      if (currentUser?.userid == null) {
        throw Exception('用户未登录');
      }
      
      final userId = currentUser!.userid!;
      final userName = currentUser.username ?? '用户';
      
      // 🔥 第一步：调用API加入活动
      developer.log('$tag: 📡 步骤1：调用API加入活动');
      final apiResult = await ActivityApi.joinActivity(
        activityId: activityId,
        userId: userId,
      );
      
      if (apiResult['status'] != 'success') {
        throw Exception(apiResult['message'] ?? '加入活动失败');
      }
      
      developer.log('$tag: ✅ API调用成功');
      
      // 🔥 第二步：获取发布者手机号（融云用户ID）
      developer.log('$tag: 📱 步骤2：获取发布者手机号');
      final publisherPhone = await _getUserPhoneById(publisherId);
      
      if (publisherPhone == null || publisherPhone.isEmpty) {
        developer.log('$tag: ⚠️ 无法获取发布者手机号，跳过IM通知');
        return apiResult;
      }
      
      developer.log('$tag: ✅ 发布者手机号: $publisherPhone');
      
      // 🔥 第三步：发送IM通知消息（可选，失败不影响主流程）
      try {
        developer.log('$tag: 📨 步骤3：发送IM通知消息');
        
        // 🔥 参考playtrue3的消息格式：'$userName 申请参加活动：$activityTitle***'
        // 使用***作为活动申请消息的标识符（融云服务会识别）
        final notificationMessage = '$userName 申请参加活动：$activityTitle***';
        
        developer.log('$tag: 💬 消息内容: $notificationMessage');
        developer.log('$tag: 📱 目标融云用户ID: $publisherPhone');
        
        // 🔥 使用手机号作为融云用户ID（参考playtrue3架构）
        final imSuccess = await _rongCloud.sendTextMessage(
          targetId: publisherPhone, // ✅ 使用手机号，不是数据库ID！
          content: notificationMessage,
          showLoading: false,
        );
        
        if (imSuccess) {
          developer.log('$tag: ✅ IM通知发送成功（融云用户ID: $publisherPhone）');
        } else {
          developer.log('$tag: ⚠️ IM通知发送失败（不影响主流程）');
        }
        
      } catch (e) {
        developer.log('$tag: ⚠️ IM通知发送异常（不影响主流程）: $e');
      }
      
      developer.log('$tag: ✅ 加入活动事务完成');
      
      return apiResult;
      
    } catch (e) {
      developer.log('$tag: ❌ 加入活动失败: $e');
      // 🔥 提取纯文本错误消息，去掉"Exception: "前缀
      final errorMessage = e.toString().replaceAll('Exception: ', '');
      return {
        'status': 'error',
        'message': errorMessage,
      };
    }
  }
  
  /// 🔥 审核活动参与申请（API + IM通知）
  /// 
  /// 参考playtrue3架构实现：
  /// 1. 调用API审核申请
  /// 2. 获取申请用户手机号（融云用户ID）
  /// 3. API成功后发送IM通知
  /// 4. 统一错误处理
  /// 
  /// @param activityId 活动ID
  /// @param userId 申请用户ID（数据库用户ID）
  /// @param reviewStatus 审核状态（approved/rejected）
  /// @param activityTitle 活动标题
  /// @param reviewNote 审核备注
  /// @returns 操作结果
  Future<Map<String, dynamic>> reviewActivityParticipant({
    required int activityId,
    required int userId,
    required String reviewStatus,
    required String activityTitle,
    String? reviewNote,
  }) async {
    try {
      developer.log('$tag: =============== 审核活动申请（事务性操作） ===============');
      developer.log('$tag: 🎯 活动ID: $activityId');
      developer.log('$tag: 👤 用户ID: $userId');
      developer.log('$tag: 📝 审核状态: $reviewStatus');
      
      final currentUser = _userService.userInfo;
      if (currentUser?.userid == null) {
        throw Exception('用户未登录');
      }
      
      // 🔥 第一步：调用API审核申请
      developer.log('$tag: 📡 步骤1：调用API审核申请');
      final apiResult = await ActivityApi.reviewParticipantApplication(
        activityId: activityId,
        userId: userId,
        reviewStatus: reviewStatus,
        reviewNote: reviewNote,
      );
      
      if (!apiResult.isSuccess) {
        throw Exception(apiResult.message.isNotEmpty ? apiResult.message : '审核失败');
      }
      
      developer.log('$tag: ✅ API调用成功');
      
      // 🔥 第二步：获取申请用户手机号（融云用户ID）
      developer.log('$tag: 📱 步骤2：获取申请用户手机号');
      final userPhone = await _getUserPhoneById(userId);
      
      if (userPhone == null || userPhone.isEmpty) {
        developer.log('$tag: ⚠️ 无法获取申请用户手机号，跳过IM通知');
        return {
          'status': 'success',
          'message': apiResult.message,
        };
      }
      
      developer.log('$tag: ✅ 申请用户手机号: $userPhone');
      
      // 🔥 第三步：发送IM通知消息（可选）
      try {
        developer.log('$tag: 📨 步骤3：发送IM通知消息');
        
        String notificationMessage = '';
        
        if (reviewStatus == 'approved') {
          notificationMessage = '你的活动「$activityTitle」申请已通过';
          if (reviewNote != null && reviewNote.isNotEmpty) {
            notificationMessage += '，备注：$reviewNote';
          }
        } else if (reviewStatus == 'rejected') {
          notificationMessage = '你的活动「$activityTitle」申请已被拒绝';
          if (reviewNote != null && reviewNote.isNotEmpty) {
            notificationMessage += '，原因：$reviewNote';
          }
        }
        
        developer.log('$tag: 💬 消息内容: $notificationMessage');
        developer.log('$tag: 📱 目标融云用户ID: $userPhone');
        
        // 🔥 使用手机号作为融云用户ID
        final imSuccess = await _rongCloud.sendTextMessage(
          targetId: userPhone, // ✅ 使用手机号，不是数据库ID！
          content: notificationMessage,
          showLoading: false,
        );
        
        if (imSuccess) {
          developer.log('$tag: ✅ IM通知发送成功（融云用户ID: $userPhone）');
        } else {
          developer.log('$tag: ⚠️ IM通知发送失败（不影响主流程）');
        }
        
      } catch (e) {
        developer.log('$tag: ⚠️ IM通知发送异常（不影响主流程）: $e');
      }
      
      developer.log('$tag: ✅ 审核活动申请事务完成');
      
      return {
        'status': 'success',
        'message': apiResult.message,
      };
      
    } catch (e) {
      developer.log('$tag: ❌ 审核活动申请失败: $e');
      // 🔥 提取纯文本错误消息，去掉"Exception: "前缀
      final errorMessage = e.toString().replaceAll('Exception: ', '');
      return {
        'status': 'error',
        'message': errorMessage,
      };
    }
  }
  
  // ==================== 活动发布相关流程 ====================
  
  /// 🔥 发布活动（业务编排）
  /// 
  /// ✅ 修复：移除重复扣除积分的逻辑
  /// 积分扣除由API层和后端统一处理
  /// 
  /// 企业级事务性操作：
  /// 1. 调用API发布活动（API内部会处理积分检查和扣除）
  /// 
  /// @param activityData 活动数据Map（必须包含userId）
  /// @param checkPermission 是否检查积分权限（默认true）
  /// @returns 操作结果（包含积分变化信息）
  Future<Map<String, dynamic>> publishActivity({
    required Map<String, dynamic> activityData,
    bool checkPermission = true,
  }) async {
    try {
      developer.log('$tag: =============== 发布活动（业务编排） ===============');
      developer.log('$tag: 📝 活动数据: ${activityData['activityTitle']}');
      developer.log('$tag: 🎯 权限检查: $checkPermission');
      
      // 验证用户ID
      int? userId;
      if (activityData.containsKey('userId')) {
        userId = activityData['userId'] is int 
            ? activityData['userId'] 
            : int.tryParse(activityData['userId'].toString());
      }
      
      if (userId == null) {
        throw Exception('活动数据缺少用户ID（userId）');
      }
      
      developer.log('$tag: 👤 发布者ID: $userId');
      
      // ✅ 直接调用API发布活动（API内部会处理积分检查和扣除）
      developer.log('$tag: 📡 调用API发布活动');
      
      final apiResult = await ActivityApi.publishActivity(
        activityData: activityData,
        checkPermission: checkPermission,  // ✅ 传递权限检查标志
      );
      
      if (apiResult['status'] != 'success') {
        final errorMsg = apiResult['message'] ?? '活动发布失败';
        developer.log('$tag: ❌ 活动发布失败: $errorMsg');
        throw Exception(errorMsg);
      }
      
      developer.log('$tag: ✅ 活动发布成功');
      
      // 获取积分变化信息（API已经更新了本地积分）
      final pointsChange = apiResult['pointsChange'] ?? 0;
      if (pointsChange != 0) {
        developer.log('$tag: 💰 积分变化: $pointsChange');
      }
      
      developer.log('$tag: ✅ 活动发布业务编排完成');
      
      // 返回结果
      return {
        'status': 'success',
        'message': apiResult['message'] ?? '活动发布成功',
        'activity_id': apiResult['activity_id'],
        'pointsChange': pointsChange,  // ✅ 返回积分变化
      };
      
    } catch (e) {
      developer.log('$tag: ❌ 发布活动业务编排失败: $e');
      // 🔥 提取纯文本错误消息，去掉"Exception: "前缀
      final errorMessage = e.toString().replaceAll('Exception: ', '');
      return {
        'status': 'error',
        'message': errorMessage,
      };
    }
  }
  
  // ==================== 聊天消息 ====================
  
  /// 🔥 发送聊天消息（纯IM操作，不涉及API）
  /// 
  /// @param targetId 目标用户ID
  /// @param content 消息内容
  /// @param showLoading 是否显示加载提示
  /// @returns 发送结果
  Future<bool> sendChatMessage({
    required String targetId,
    required String content,
    bool showLoading = false,
  }) async {
    try {
      developer.log('$tag: 📨 发送聊天消息');
      developer.log('$tag: 👤 目标用户: $targetId');
      developer.log('$tag: 💬 消息内容: $content');
      
      final success = await _rongCloud.sendTextMessage(
        targetId: targetId,
        content: content,
        showLoading: showLoading,
      );
      
      if (success) {
        developer.log('$tag: ✅ 聊天消息发送成功');
      } else {
        developer.log('$tag: ❌ 聊天消息发送失败');
      }
      
      return success;
      
    } catch (e) {
      developer.log('$tag: ❌ 发送聊天消息异常: $e');
      return false;
    }
  }
  
  // ==================== 系统通知 ====================
  
  /// 🔥 发送系统通知（仅IM通知，无需API）
  /// 
  /// @param targetId 目标用户ID
  /// @param notificationType 通知类型
  /// @param content 通知内容
  /// @returns 发送结果
  Future<bool> sendSystemNotification({
    required String targetId,
    required String notificationType,
    required String content,
  }) async {
    try {
      developer.log('$tag: 📢 发送系统通知');
      developer.log('$tag: 👤 目标用户: $targetId');
      developer.log('$tag: 🏷️ 通知类型: $notificationType');
      developer.log('$tag: 💬 通知内容: $content');
      
      final success = await _rongCloud.sendTextMessage(
        targetId: targetId,
        content: content,
        showLoading: false,
      );
      
      if (success) {
        developer.log('$tag: ✅ 系统通知发送成功');
      } else {
        developer.log('$tag: ❌ 系统通知发送失败');
      }
      
      return success;
      
    } catch (e) {
      developer.log('$tag: ❌ 发送系统通知异常: $e');
      return false;
    }
  }
  
  // ==================== 工具方法 ====================
  
  /// 检查融云服务是否可用
  bool get isRongCloudAvailable {
    try {
      return _rongCloud.isConnected.value;
    } catch (e) {
      developer.log('$tag: ⚠️ 融云服务不可用: $e');
      return false;
    }
  }
  
  /// 获取当前用户ID
  int? get currentUserId {
    return _userService.userInfo?.userid;
  }
}

